package lil.llahn.security.common.symmetry;

import lil.llahn.security.common.utils.DeConv;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;

/**
 * @ClassName: AESSecurityTools
 * @Description: TODO  Advanced Encryption Standard - 高级加密标准
 *      AES是现在对称加密算法中最流行的算法之一。加密密钥和解密密钥相同，加密运算和解密运算互为逆运算。是一种初等的加密算法。主要的算法有DES（3DES）、AES、PBE、IDEA。
 *      AES 加密算法作为新一代的数据加密标准汇聚了强安全性、高性能、高效率、易用和灵活等优点。
 *      AES 设计有三个密钥长度：128，192，256 位。相对而言，AES 的 128 密钥比 DES 的 56 密钥强了 1021 倍。
 * @Date: 2019/11/8 14:42
 * @Auther: lil
 */
public class AESSecurityTools {
    private static final String ALGORITHM_KEY = "AES";
    private static final int AES_KEY_SIZE = 256;
    public final static String UTF8 = "UTF-8";
    /**
     * @param data
     * @param key 秘钥
     * @return
     */
    public static String encryptAESByKey(String data, String key) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance(ALGORITHM_KEY);
            kgen.init(AES_KEY_SIZE, new SecureRandom(key.getBytes()));
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec sks = new SecretKeySpec(enCodeFormat, ALGORITHM_KEY);
            Cipher cipher = Cipher.getInstance(ALGORITHM_KEY);// 创建密码器
            byte[] byteContent = data.getBytes(UTF8);
            cipher.init(Cipher.ENCRYPT_MODE, sks);// 初始化加密器
            byte[] result = cipher.doFinal(byteContent);
            return DeConv.parseByte2HexStr(result);//不可直接转成字符串
        }catch (Exception e){
            throw new RuntimeException(e.getMessage(), e);
        }
    }

    /**
     * @param data
     * @param key 秘钥
     * @return
     */
    public static String decryptAESByKey(String data, String key) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance(ALGORITHM_KEY);
            kgen.init(AES_KEY_SIZE, new SecureRandom(key.getBytes()));
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec sks = new SecretKeySpec(enCodeFormat, ALGORITHM_KEY);
            Cipher cipher = Cipher.getInstance(ALGORITHM_KEY);// 创建密码器
            cipher.init(Cipher.DECRYPT_MODE, sks);// 初始化解密器
            byte[] decryptFrom = DeConv.parseHexStr2Byte(data);
            byte[] result1 = cipher.doFinal(decryptFrom);
            return new String(result1);
        }catch (Exception e){
            throw new RuntimeException(e.getMessage(), e);
        }
    }
}
